home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Workspace / Locus / Source / Preferences.m < prev    next >
Text File  |  1995-06-12  |  10KB  |  551 lines

  1.  
  2. /*
  3.     Copyright 1993  Jeremy Slade.
  4.  
  5.     You are free to use all or any parts of the Locus project
  6.     however you wish, just give credit where credit is due.
  7.     The author (Jeremy Slade) shall not be held responsible
  8.     for any damages that result out of use or misuse of any
  9.     part of this project.
  10.  
  11. */
  12.  
  13. /*
  14.     Project: Locus
  15.     
  16.     Class: Preferences
  17.     
  18.     Description: Preferences.h
  19.     
  20.     Original Author: Jeremy Slade
  21.     
  22.     Revision History:
  23.         Created
  24.             V.101    JGS Mon Feb  8 22:49:15 GMT-0700 1993
  25.  
  26. */
  27.  
  28. #import "Preferences.h"
  29.  
  30. #import "Activator.h"
  31. #import "AppIconView.h"
  32. #import "AtomList.h"
  33. #import "FolderController.h"
  34. #import "FolderViewer.h"
  35. #import "SwapView.h"
  36. #import "Globals.h"
  37. #import "MainController.h"
  38.  
  39. #import <defaults/defaults.h>
  40. #import <objc/List.h>
  41. #import <objc/NXStringTable.h>
  42. #import <stdlib.h>
  43. #import <sys/param.h>
  44.  
  45.  
  46. // Toggles
  47. #define TOGGLE_AUTOLAUNCH_HIDE    0
  48. #define TOGGLE_HIDEONDEACTIVATE    1
  49. #define TOGGLE_VERIFY_ACTIONS        2
  50. #define TOGGLE_AUTOSAVE                3
  51. #define TOGGLE_ACTIVATOR_ADD        4
  52. #define TOGGLE_APPICON_ADD            5
  53.  
  54.  
  55. char *prefsTitles[] = {
  56.     "General Options", "Default Viewer", "Startup Folders", NULL
  57. };
  58.  
  59.  
  60. @implementation Preferences
  61.  
  62.  
  63. // -------------------------------------------------------------------------
  64. //   Creating, initializing
  65. // -------------------------------------------------------------------------
  66.  
  67.  
  68. + initialize
  69. {
  70.     [self setVersion:Preferences_VERSION];
  71.     return ( self );
  72. }
  73.  
  74.  
  75.  
  76. - init
  77. {
  78.     [super init];
  79.     
  80.     // Load the nib section into the created zone
  81.     [NXApp loadNibSection:"Preferences.nib"
  82.         owner:self
  83.         withNames:NO];
  84.     [self setGeneralLevel:self];
  85.  
  86.     return ( self );
  87. }
  88.  
  89.  
  90.  
  91. - awakeFromNib
  92. /*
  93.     Perfrom final initializations
  94. */
  95. {
  96.     [self setGeneralLevel:self];
  97.     return ( self );
  98. }
  99.  
  100.  
  101.  
  102. - free
  103. {
  104.     return ( [super free] );
  105. }
  106.  
  107.  
  108.  
  109. // -------------------------------------------------------------------------
  110. //   Setting the prefs level
  111. // -------------------------------------------------------------------------
  112.  
  113.  
  114. - setGeneralLevel:sender
  115. {
  116.     prefsLevel = PREFS_GENERAL_LEVEL;
  117.     [self displayPrefs];
  118.     return ( self );
  119. }
  120.  
  121.  
  122.  
  123. - setViewerLevel:sender
  124. {
  125.     prefsLevel = PREFS_VIEWER_LEVEL;
  126.     [self displayPrefs];
  127.     return ( self );
  128. }
  129.  
  130.  
  131.  
  132. - setFoldersLevel:sender
  133. {
  134.     prefsLevel = PREFS_FOLDERS_LEVEL;
  135.     [self displayPrefs];
  136.     return ( self );
  137. }
  138.  
  139.  
  140.  
  141. - swapPaneFor:sender
  142. /*
  143.     The SwapView's delegate method that determines which view to use for the current setting
  144. */
  145. {
  146.     switch ( prefsLevel ) {
  147.         case PREFS_GENERAL_LEVEL: return generalPrefsPanel;
  148.         case PREFS_VIEWER_LEVEL: return viewerPrefsPanel;
  149.         case PREFS_FOLDERS_LEVEL: return folderPrefsPanel;
  150.     }
  151.     
  152.     return ( nil ); // unrecognized prefs level
  153. }
  154.  
  155.  
  156.  
  157. // -------------------------------------------------------------------------
  158. //   Displaying
  159. // -------------------------------------------------------------------------
  160.  
  161.  
  162. - panel
  163. {
  164.     return ( panel );
  165. }
  166.  
  167.  
  168.  
  169. - displayPrefs
  170. /*
  171.     Update the display to show current settings
  172. */
  173. {
  174.     [swapView swap];
  175.     
  176.     switch ( prefsLevel ) {
  177.         case PREFS_GENERAL_LEVEL:
  178.             [self displayActivator];
  179.             [self displayToggles];
  180.             break;
  181.             
  182.         case PREFS_VIEWER_LEVEL:
  183.             [self displayViewerFrame];
  184.             break;
  185.             
  186.         case PREFS_FOLDERS_LEVEL:
  187.             [self displayStartupFolders];
  188.             break;
  189.             
  190.         default:    break;
  191.     }
  192.     
  193.     [modeCover setTitle:prefsTitles[prefsLevel]];
  194.     [panel display];
  195.     return ( self );
  196. }
  197.  
  198.  
  199.  
  200. - displayActivator
  201. {
  202.     id activator = [mainController activator];
  203.  
  204.     activatorMask = [activator barMask];
  205.     [topSwitch setState:[activator isBarOn:ACT_TOP]];
  206.     [leftSwitch setState:[activator isBarOn:ACT_LEFT]];
  207.     [rightSwitch setState:[activator isBarOn:ACT_RIGHT]];
  208.     [bottomSwitch setState:[activator isBarOn:ACT_BOTTOM]];
  209.  
  210.     [floatSwitch setState:(floatActivator = [activator isFloating])];
  211.     
  212.     [interiorWell setColor:(activatorFillColor = [activator color])];
  213.     [borderWell setColor:(activatorBorderColor = [activator borderColor])];
  214.  
  215.     [mainController hideActivator:self];
  216.     [mainController showActivator:self];
  217.     
  218.     return ( self );
  219. }
  220.  
  221.  
  222.  
  223. - displayToggles
  224. {
  225.     [[toggles cellAt:TOGGLE_AUTOLAUNCH_HIDE :0] setState:autolaunchHide];
  226.     [[toggles cellAt:TOGGLE_HIDEONDEACTIVATE :0] setState:hideDeactive];
  227.     [[toggles cellAt:TOGGLE_VERIFY_ACTIONS :0] setState:verifyActions];
  228.     [[toggles cellAt:TOGGLE_AUTOSAVE :0] setState:autoSave];
  229.     [[toggles cellAt:TOGGLE_ACTIVATOR_ADD :0] setState:activatorAdd];
  230.     [[toggles cellAt:TOGGLE_APPICON_ADD :0] setState:appIconAdd];
  231.     
  232.     return ( self );
  233. }
  234.  
  235.  
  236.  
  237. - displayViewerFrame
  238. {
  239.     [xField setFloatValue:NX_X(&defaultViewerFrame)];
  240.     [yField setFloatValue:NX_Y(&defaultViewerFrame)];
  241.     [wField setFloatValue:NX_WIDTH(&defaultViewerFrame)];
  242.     [hField setFloatValue:NX_HEIGHT(&defaultViewerFrame)];
  243.     
  244.     return ( self );
  245. }
  246.  
  247.  
  248.  
  249. - displayStartupFolders
  250. {
  251.     [browser loadColumnZero];
  252.     return ( self );
  253. }
  254.  
  255.  
  256.  
  257. // -------------------------------------------------------------------------
  258. //   Toggles
  259. // -------------------------------------------------------------------------
  260.  
  261.  
  262. - setAutolaunchHide:sender
  263. {
  264.     autolaunchHide = [[toggles cellAt:TOGGLE_AUTOLAUNCH_HIDE :0] state];    return ( self );
  265. }
  266.  
  267.  
  268.  
  269. - setHideDeactive:sender
  270. {
  271.     hideDeactive = [[toggles cellAt:TOGGLE_HIDEONDEACTIVATE :0] state];
  272.     return ( self );
  273. }
  274.  
  275.  
  276.  
  277. - setVerifyActions:sender
  278. {
  279.     verifyActions = [[toggles cellAt:TOGGLE_VERIFY_ACTIONS :0] state];
  280.     return ( self );
  281. }
  282.  
  283.  
  284.  
  285. - setAutoSave:sender
  286. {
  287.     autoSave = [[toggles cellAt:TOGGLE_AUTOSAVE :0] state];
  288.     return ( self );
  289. }
  290.  
  291.  
  292.  
  293. - setActivatorAdd:sender
  294. {
  295.     activatorAdd = [[toggles cellAt:TOGGLE_ACTIVATOR_ADD :0] state];
  296.     [activator setDraggingEnabled:activatorAdd];
  297.     return ( self );
  298. }
  299.  
  300.  
  301.  
  302. - setAppIconAdd:sender
  303. {
  304.     appIconAdd = [[toggles cellAt:TOGGLE_APPICON_ADD :0] state];
  305.     [appIconView setDraggingEnabled:appIconAdd];
  306.     return ( self );
  307. }
  308.  
  309.  
  310.  
  311. // -------------------------------------------------------------------------
  312. //   Activator Bar
  313. // -------------------------------------------------------------------------
  314.  
  315.  
  316. - setActivatorTop:sender
  317. {
  318.     [[mainController activator] setBar:ACT_TOP on:[topSwitch state]];
  319.     [self displayActivator];
  320.     return ( self );
  321. }
  322.  
  323.  
  324.  
  325. - setActivatorLeft:sender
  326. {
  327.     [[mainController activator] setBar:ACT_LEFT on:[leftSwitch state]];
  328.     [self displayActivator];
  329.     return ( self );
  330. }
  331.  
  332.  
  333.  
  334. - setActivatorRight:sender
  335. {
  336.     [[mainController activator] setBar:ACT_RIGHT on:[rightSwitch state]];
  337.     [self displayActivator];
  338.     return ( self );
  339. }
  340.  
  341.  
  342.  
  343. - setActivatorBottom:sender
  344. {
  345.     [[mainController activator] setBar:ACT_BOTTOM on:[bottomSwitch state]];
  346.     [self displayActivator];
  347.     return ( self );
  348. }
  349.  
  350.  
  351.  
  352. - setActivatorFloat:sender
  353. {
  354.     [[mainController activator] setFloating:[floatSwitch state]];
  355.     [self displayActivator];
  356.     return ( self );
  357. }
  358.  
  359.  
  360.  
  361. - setActivatorFillColor:sender
  362. {
  363.     [[mainController activator] setColor:[interiorWell color]];
  364.     [self displayActivator];
  365.     return ( self );
  366. }
  367.  
  368.  
  369.  
  370. - setActivatorBorderColor:sender
  371. {
  372.     [[mainController activator] setBorderColor:[borderWell color]];
  373.     [self displayActivator];
  374.     return ( self );
  375. }
  376.  
  377.  
  378.  
  379. // -------------------------------------------------------------------------
  380. //   Default Viewer Frame
  381. // -------------------------------------------------------------------------
  382.  
  383.  
  384. - setViewerFrameToCurrent:sender
  385. {
  386.     id currentViewer = [[folderController keyFolder] viewer];
  387.     if ( !currentViewer ) NXBeep();
  388.         else  [currentViewer getFrame:&defaultViewerFrame];
  389.     [self displayViewerFrame];
  390.     return ( self );
  391. }
  392.  
  393.  
  394.  
  395. - setViewerX:sender
  396. {
  397.     defaultViewerFrame.origin.x = [xField intValue];
  398.     [self displayViewerFrame];
  399.     return ( self );
  400. }
  401.  
  402.  
  403.  
  404. - setViewerY:sender
  405. {
  406.     defaultViewerFrame.origin.y = [yField intValue];
  407.     [self displayViewerFrame];
  408.     return ( self );
  409. }
  410.  
  411.  
  412.  
  413. - setViewerW:sender
  414. {
  415.     defaultViewerFrame.size.width = [wField intValue];
  416.     [self displayViewerFrame];
  417.     return ( self );
  418. }
  419.  
  420.  
  421.  
  422. - setViewerH:sender
  423. {
  424.     defaultViewerFrame.size.height = [hField intValue];
  425.     [self displayViewerFrame];
  426.     return ( self );
  427. }
  428.  
  429.  
  430.  
  431. // -------------------------------------------------------------------------
  432. //   Startup Folders
  433. // -------------------------------------------------------------------------
  434.  
  435.  
  436. - (int)browser:sender fillMatrix:matrix inColumn:(int)col
  437. /*
  438.     Load the browser with the folders in startupFolders.
  439.     StartupFolders is an AtomList containing the names of the folders that will be opened at startup
  440. */
  441. {
  442.     id cell;
  443.     int i, count;
  444.     
  445.     count = [startupFolders count];
  446.     for ( i=0; i<count; i++ ) {
  447.         [matrix addRow];
  448.         cell = [matrix cellAt:i :0];
  449.         [cell initTextCell:[startupFolders atomAt:i]];
  450.         [[cell setLoaded:YES] setLeaf:YES];
  451.     }
  452.         
  453.     return ( count );
  454. }
  455.  
  456.  
  457.  
  458. - addFolders:sender
  459. /*
  460.     Add a new folder(s) to the startupFolders using an OpenPanel
  461. */
  462. {
  463.     id openPanel = [OpenPanel new];
  464.     static char directory[MAXPATHLEN+1] = "";
  465.     const char *const *files;
  466.     const char *const types[2] = { FOLDER_EXT, NULL };
  467.     int i;
  468.     char path[MAXPATHLEN+1];
  469.     
  470.     if ( !strlen ( directory ) ) 
  471.         sprintf ( directory, "%s/%s", NXHomeDirectory(), LIBRARY_DIR );
  472.     
  473.     [[openPanel setTitle:"Add Startup Folder"]
  474.         setPrompt:"File:"];
  475.     [openPanel allowMultipleFiles:YES];
  476.     
  477.     if ( [openPanel runModalForDirectory:directory file:NULL types:types] ) {
  478.         strcpy ( directory, [openPanel directory] );
  479.         files = [openPanel filenames];
  480.         
  481.         // Register selected items
  482.         i = 0;
  483.         while ( files[i] ) {
  484.             sprintf ( path, "%s/%s", directory, files[i] );
  485.             [startupFolders addAtomIfAbsent:
  486.                 NXUniqueString([folderController relativePathForFolder:path])];
  487.             i++;
  488.         }    
  489.     }
  490.     
  491.     [self displayStartupFolders];
  492.     
  493.     return ( self );
  494. }
  495.  
  496.  
  497.  
  498. - removeFolders:sender
  499. /*
  500.     Remove the selected cells in the browser from the startupFolders
  501. */
  502. {
  503.     int i, count;
  504.     int j, cnt;
  505.     id cellList;
  506.         
  507.     cellList = [[browser matrixInColumn:0] cellList];
  508.     count = [cellList count];
  509.     for ( i=0; i<count; i++ )
  510.         if ( [[cellList objectAt:i] state] ) {
  511.             cnt = [startupFolders count];
  512.             for ( j=0; j<cnt; j++ ) {
  513.                 if ( !strcmp ( [startupFolders atomAt:j],
  514.                     [[cellList objectAt:i] stringValue] ) ) {
  515.                         [startupFolders removeAtomAt:j];
  516.                         break; // break out of inner for loop
  517.                 }
  518.             }
  519.         }
  520.             
  521.     [self displayStartupFolders];
  522.     
  523.     return ( self );
  524. }
  525.  
  526.  
  527.  
  528. // -------------------------------------------------------------------------
  529. //   Saving settings
  530. // -------------------------------------------------------------------------
  531.  
  532.  
  533. - setPrefs:sender
  534. {
  535.     [mainController writePrefs:self];
  536.     return ( self );
  537. }
  538.  
  539.  
  540.  
  541. - restorePrefs:sender
  542. {
  543.     [mainController readPrefs:self];    
  544.     [self displayPrefs];    
  545.     return ( self );
  546. }
  547.  
  548.  
  549.  
  550. @end
  551.